﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace EFDataModel
{
    public partial class EFPerson : IComparable<EFPerson>, IComparable
    {
        #region Static
        /// <summary>
        /// Der Name für die Standadresse die bei jedem Nutzer gesetzt wird, wenn eine Adresse angegeben wird.
        /// </summary>
        public static string DefaultAddressName = Resources.EFResources.DefaultUserAddressNameRESX;
        #endregion

        #region Member
        private EFAddress _defaultAddress;
        #endregion

        #region Properties
        /// <summary>
        /// Gibt die Defaultadresse für den aktuellen User zurück.
        /// </summary>
        public EFAddress DefaultAddress
        {
            get
            {
                if (_defaultAddress == null)
                {
                    //Ermitteln der Defaultadresse, des aktuellen Nutzers
                    _defaultAddress = (from eAddress in EFAddresses where eAddress.IsDefault select eAddress).FirstOrDefault();

                    //Wenn keine Adresse gefunden werden konnte, dann eine Leere Adresse setzten
                    if (_defaultAddress == null)
                    {
                        _defaultAddress = new EFAddress();
                    }
                }
                
                return _defaultAddress;
            }
        }

        #endregion

        #region Public Functions
        /// <summary>
        /// Gibt den kompletten Namen des Users zurück
        /// </summary>
        public string GetFullName()
        {
            return string.Format("{0} {1}", Firstname, Lastname);
        }

        /// <summary>
        /// Setzten der Standardadresse für eine Person. Hier wird geschaut ob eine Standardadresse hinterlegt ist und wenn ja wird diese durch die Werte ersetzt.
        /// oder die Adresse wird als neue Standardadresse angelegt, wenn diese noch nicht existiert.
        /// </summary>
        /// <param name="street">Name der Straße</param>
        /// <param name="number">Hausnummer</param>
        /// <param name="city">Stadt</param>
        /// <param name="zipcode">Postleitzahl</param>
        /// <param name="countryId">die landesId die gesetzt werden soll</param>
        /// <param name="currentUserId">die aktuelle BenutzerId die genutzt wird um den letzten Bearbeiter zu setzten.</param>
        /// <returns>TRUE->Wurde erfolgreich bearbeitet/angelegt | FALSE->Kein Wert wurde übergeben, auch keine neue Adresse angelegt</returns>
        public bool SetDefaultAddress(string street, string number, string city, string zipcode, int? countryId, long currentUserId)
        {
            //Wenn kein Wert übergeben wird, dann muss auch keine neue Adresse angelegt werden.
            if (string.IsNullOrEmpty(street) && string.IsNullOrEmpty(number) && string.IsNullOrEmpty(city) && string.IsNullOrEmpty(zipcode) && !countryId.HasValue)
            {
                return false;
            }

            //Die Standardadresse für den aktuellen Benutzter heraussuchen
            var defaultAddress = (from eAddress in EFAddresses where eAddress.IsDefault = true select eAddress).FirstOrDefault();

            //Die Adresse existiert bereits und muss nur noch bearbeitet werden.
            if (defaultAddress != null)
            {
                //Die Adressdaten aktualisieren
                defaultAddress.HouseNumber = number ?? string.Empty;
                defaultAddress.EFCountryID = countryId;
                defaultAddress.Street = street ?? string.Empty;
                defaultAddress.City = city ?? string.Empty;
                defaultAddress.Zipcode = zipcode ?? string.Empty;
                //Den aktuellen Bearbeiter und das Bearbeitungsdatum setzten.
                defaultAddress.EditorID = currentUserId;
                defaultAddress.EditDate = DateTime.Now;
            }
            else
            {
                //Erstellen einer neuen Adresse und unserer Auflistung hinzufügen
                EFAddress newAddress = EFAddress.GetNewAddress(street, number, city, zipcode, countryId, currentUserId, DefaultAddressName);
                //Setzten das es sich um die Defaultadresse des Nutzers handelt, davon sollte Pro User nur eine Existieren!!
                newAddress.IsDefault = true;
                EFAddresses.Add(newAddress);
            }

            return true;
        }
        #endregion

        /// <summary>
        /// Vergleicht das aktuelle Objekt mit einem anderen Objekt desselben Typs.
        /// </summary>
        /// <returns>
        /// Ein Wert, der die relative Reihenfolge der verglichenen Objekte angibt.Der Rückgabewert hat folgende Bedeutung:Wert Bedeutung Kleiner als 0 (null) Dieses Objekt ist kleiner als der <paramref name="other"/>-Parameter.Zero Dieses Objekt ist gleich <paramref name="other"/>. Größer als 0 (null) Dieses Objekt ist größer als <paramref name="other"/>. 
        /// </returns>
        /// <param name="other">Ein Objekt, das mit diesem Objekt verglichen werden soll.</param>
        public int CompareTo(EFPerson other)
        {
            return string.Compare(this.GetFullName(), other.GetFullName());
        }

        /// <summary>
        /// Vergleicht die aktuelle Instanz mit einem anderen Objekt vom selben Typ und gibt eine ganze Zahl zurück, die angibt, ob die aktuelle Instanz in der Sortierreihenfolge vor oder nach dem anderen Objekt oder an derselben Position auftritt.
        /// </summary>
        /// <returns>
        /// Ein Wert, der die relative Reihenfolge der verglichenen Objekte angibt.Der Rückgabewert hat folgende Bedeutung:Wert Bedeutung Kleiner als 0 Diese Instanz ist kleiner als <paramref name="obj"/>. 0 Diese Instanz ist gleich <paramref name="obj"/>. Größer als 0 Diese Instanz ist größer als <paramref name="obj"/>. 
        /// </returns>
        /// <param name="obj">Ein Objekt, das mit dieser Instanz verglichen werden soll. </param><exception cref="T:System.ArgumentException"><paramref name="obj"/> hat nicht denselben Typ wie diese Instanz. </exception><filterpriority>2</filterpriority>
        public int CompareTo(object obj)
        {
            //Prüfen ob das übergenene Objekt auch ein User ist.
            if (obj.GetType() == typeof(EFPerson))
            {
                EFPerson efUser = (EFPerson)obj;
                return string.Compare(this.GetFullName(), efUser.GetFullName());
            }

            throw new NotImplementedException("Es muss eine Person übergeben werden!");
        }
    }
}
